今天的目標非常簡單,我們要自己寫一個非常陽春的 http server 監聽在 port 8080,話不多說,直接開始吧!
net
是 Go 裡面專門處理網路相關的 package,而底下的 net/http
則負責處理 http,因為我們要寫的是 http server 所以在這邊會大量使用到他
// main.go
import "net/http"
func handler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello World"))
}
為了處理請求我們要先寫好一個 request handler,在 Go 中 handler 通常會接受兩個參數 w
跟 r
:
w
是一個 http.ResponseWriter
,看他的型別就知道他主要負責把資料回覆給瀏覽器,其中最常用的 method 是 w.Write([]byte)
,用來傳輸 []byte
格式的資料,如果你寫過 Node.js 的話那就相當於 Express 的 res.send()
r
的型別是 *http.Request
,相當於 Express 中的 req
物件,裡面包含這個請求的 http method、header、body 等等,需要的時候就可以拿出來用,比較常用的有 r.Body
、r.Header
取得請求的 body 跟 header
上面那個 handler 做的事情很簡單,就只是回覆 Hello World
給 Http Client,因為 res.Write()
只接受 byte array,所以要先把 Hello World
轉型成 []byte
再送出,這樣瀏覽器就會收到 Hello World
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
整個程式的起點 main()
先用 http.HandleFunc("/", handler)
指派剛寫好的 handler function 負責處理所有請求,包刮各種 method 像是 GET、POST 等等
接下來就是使用 http.ListenAndServe
監聽在 port 8080,這樣就完成了一個最基本的 http server,用終端機跑 go run main.go
之後就可以在 http://localhost:8080 看到 Hello World
,很簡單吧~
func main() {
http.HandleFunc("/", handler)
err := http.ListenAndServe(":8080", nil)
if err != nil {
panic(err)
}
}
有時在監聽的過程中可能會發生一些錯誤,譬如說 port 已經被佔用或是其他問題,這時候就可以檢查 http.ListenAndServe
回傳的錯誤是不是空的(nil
),如果有錯誤就 panic
然後終止程式,類似其他語言的 throw error
今天用內建的 net/http
自己寫了一個非常陽春的 http server,程式碼都放在 Github 上,可以 clone 下來然後 checkout 到 5cbf8f3
跑跑看
跟前幾天一樣,有什麼問題或看不懂的地方都很歡迎大家在下面留言,我會盡量回覆大家~